// index.js
// 通过require获取两个node内置模块
const http = require('http');
const nUrl = require('url');

// '127.0.0.1'表明只有本机可访问，'0.0.0.0'表示所有人可访问
// const hostname = '127.0.0.1';
// const port = 3000;
const config = require('./config'); //上述两项已在config.js中定义

const controller = require('./controller');
const route = require('./route').map(item => {//路由定义
    console.log(`route ${item.method}:${item.path}`);
    let tuple = item.impl.split('.');
    item.impl = controller[tuple[0]][tuple[1]];
    return item;
});

// 通过http.createServer获取一个server实例
// 其中(req, res) => {}，在服务器每次接收到请求时都会被执行
const server = http.createServer((req, res) => {
    let method = req.method; // 客户端请求方法
    let url = nUrl.parse(req.url); // 将请求url字符串转换为node的url对象

    let matchRoute = route.find(item => {//判断前后端请求方式是否一致
        return item.method === method && item.path === url.pathname;
    });

    if (matchRoute) {//如果请求一致，调用route中的impl
        matchRoute.impl(req, res);
        return;
    }
    // // 如果客户端GET请求'/'，会执行这个分支里面的逻辑
    // if (method === 'GET' && url.pathname === '/') {
    //     res.statusCode = 200;
    //     res.setHeader('Content-Type', 'text/plain');
    //     res.end('Hello World');
    //     return;
    // }

    // // 如果客户端GET请求'/api/user'，会执行这个分支里面的逻辑
    // if (method === 'GET' && url.pathname === '/api/user') {
    //     res.statusCode = 200;
    //     res.setHeader('Content-Type', 'application/json');
    //     res.end(JSON.stringify({
    //         code: 0,
    //         msg: '',
    //         result: {
    //             username: 'shasharoman'
    //         }
    //     }));
    //     return;
    // }

    // 没有匹配其他分支的话，执行以下逻辑
    res.statusCode = 404;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Not Found');
});

// server开始监听，等待请求到来
server.listen(config.port, config.hostname, () => {
    console.log(`Server running at http://${config.hostname}:${config.port}/`);
});